package Patterns;

import java.util.*;



public class PatternAnalyser 
{
	//This class provides several functions to analyse patterns
	public int computeVariableDistance(Pattern pattern) 
	{
		//This function computes the variable distance from a pattern
		ArrayList<Integer> varOrder = pattern.getVarOrder();
		int maxDistance = 0;
		int varNumber = pattern.getVarNumber();
		int[] variableDistances = new int[varNumber];
		int length = pattern.getLength();
		boolean[] variableSeen = new boolean[varNumber];
		boolean[][] innerSegments = new boolean[varNumber][varNumber];

		for (int i = 0; i < varNumber; i++) 
		{
			variableSeen[i] = false;
			variableDistances[i] = 0;
			for (int j = 0; j < varNumber; j++) 
			{
				innerSegments[i][j] = false;
			}
		}

		for (int i = 0; i < length; i++) 
		{
			for (int j = 0; j < varNumber; j++) 
			{
				if ((variableSeen[j] == true) && (j != varOrder.get(i))) 
				{
					if (innerSegments[j][varOrder.get(i)] == false) 
					{
						variableDistances[j]++;
						innerSegments[j][varOrder.get(i)] = true;
					}
				}

				if ((variableSeen[j] == true) && (j == varOrder.get(i))) 
				{
					if (variableDistances[j] > maxDistance) 
					{
						maxDistance = variableDistances[j];
					}
					variableDistances[j] = 0;
					for (int k = 0; k < varNumber; k++) 
					{
						innerSegments[j][k] = false;
					}
				}
			}

			if (variableSeen[varOrder.get(i)] == false) 
			{
				variableSeen[varOrder.get(i)] = true;
			}
		}

		return maxDistance;
	}

	public void canonicalRename(Pattern pattern) 
	{
		//This function renames patterns into the canonical form of a pattern.
		int varNumber = pattern.getVarNumber();
		int length = pattern.getLength();
		int[] varOrder = new int[length];
		int[] mapping = new int[varNumber];
		boolean[] isMarked = new boolean[varNumber];

		for (int i = 0; i < length; i++) {
			varOrder[i] = pattern.getVarOrder().get(i);
		}

		for (int i = 0; i < varNumber; i++) {
			isMarked[i] = false;
		}

		int currentIndex = 0;

		for (int i = 0; i < length; i++) {
			if (isMarked[varOrder[i]] == true) {
				varOrder[i] = mapping[varOrder[i]];
			} else {
				mapping[varOrder[i]] = currentIndex;
				currentIndex++;
				isMarked[varOrder[i]] = true;
				varOrder[i] = mapping[varOrder[i]];
			}
		}

		ArrayList<Integer> newVarOrder = new ArrayList<Integer>();

		for (int i = 0; i < length; i++) {
			newVarOrder.add(varOrder[i]);
		}

		int[] newOccVector = new int[varNumber];

		for (int i = 0; i < varNumber; i++) {
			newOccVector[mapping[i]] = pattern.getOccurrenceVector()[i];
		}

		pattern.setVarOrder(newVarOrder);
		pattern.setOccurrenceVector(newOccVector);

	}

}
